package com.wsoft.core.utils;

import cn.hutool.core.date.DateUtil;
import com.wsoft.constant.SessionConstant;
import com.wsoft.constant.WordConstant;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import freemarker.template.TemplateModelException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Component;

import java.io.*;
import java.util.Date;
import java.util.Map;

/**
 * @Author Zhang gukai
 * @Date 2024/11/8 13:40
 */
@Component
public class FreemarkerUtil {
    private  Configuration configuration;

    @Autowired
    private ApplicationContext applicationContext;

    public FreemarkerUtil() {
        // 初始化Freemarker配置
        configuration = new Configuration(Configuration.VERSION_2_3_31);
        configuration.setDefaultEncoding("UTF-8");
        // configuration.setClassForTemplateLoading(this.getClass(), "/templates/");
    }

    /**
     * 使用Freemarker模板生成文本
     *
     * @param templateContent 模板
     * @param dataModel    数据模型
     * @param isJob    是否定时任务,定时任务无法获取当前用户
     * @throws IOException
     * @throws TemplateException
     */
    public String processTemplate(String templateContent, Map<String, Object> dataModel,boolean isJob) {
        // 将 Spring 上下文中的 Bean 注入到 Freemarker 的共享变量中
        try {
            configuration.setSharedVariable("applicationContext", applicationContext);
        } catch (TemplateModelException e) {
            throw new RuntimeException(e);
        }
        // 创建模板
        Template template = null;
        try {
            template = new Template("template", new StringReader(templateContent), configuration);
            // 添加其他共享变量
            if(!isJob){
                dataModel.put(SessionConstant.CURRENT_USER, LoginUserUtil.getUserInfo().getLoginUserVO());
            }
            dataModel.put(SessionConstant.CURRENT_DATE, DateUtil.format(new Date(), WordConstant.CURRENT_DATE_FORMAT));
            dataModel.put(SessionConstant.CURRENT_DATE_TIME, DateUtil.format(new Date(), WordConstant.CURRENT_DATE_TIME_FORMAT));
            StringWriter writer = new StringWriter();
            // 合并模板和数据模型
            template.process(dataModel, writer);
            return writer.toString();
        } catch (IOException | TemplateException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 使用Freemarker模板生成文件
     *
     * @param templateName 模板名称（不带后缀.ftl）
     * @param dataModel    数据模型
     * @param saveFilePath 保存文件路径
     *  静态常量转换示例（例如：当前用户）
     *  假设有一个静态常量类UserConstants，其中有一个静态方法getCurrentUser()返回当前用户信息
     *  dataModel.put("currentUser", UserConstants.getCurrentUser());
     *  动态传参已经在dataModel中设置
     *  获取Spring Bean并放入数据模型（如果需要）
     *  例如：dataModel.put("someBean", getBean("someBeanName"));
     * @throws IOException
     * @throws TemplateException
     */
    public void generateFile(String templateName, Map<String, Object> dataModel, String saveFilePath) throws IOException, TemplateException {
        // 将 Spring 上下文中的 Bean 注入到 Freemarker 的共享变量中
        configuration.setSharedVariable("applicationContext", applicationContext);
        // 加载模板
        Template template = new Template("template", new StringReader(templateName), configuration);

        // 创建输出文件
        File outputFile = new File(saveFilePath);
        if (!outputFile.getParentFile().exists()) {
            outputFile.getParentFile().mkdirs();
        }
        // 使用模板生成文件
        try (Writer writer = new FileWriter(outputFile)) {
            template.process(dataModel, writer);
        }
    }
}
